package tools

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"strconv"

	"github.com/json-iterator/go"
)

// If 模拟三元运算符
func If[T any](condition bool, trueVal, falseVal T) T {
	if condition {
		return trueVal
	}
	return falseVal
}

// CreateDirIfNotExist 判断文件夹是否存在，不存在则创建（支持递归创建）
func CreateDirIfNotExist(dir string) error {
	// 获取路径信息
	_, err := os.Stat(dir)
	if err == nil {
		// 路径已存在
		fmt.Printf("目录已存在: %s\n", dir)
		return nil
	}
	// 如果错误是因为路径不存在
	if os.IsNotExist(err) {
		fmt.Printf("目录不存在，开始创建: %s\n", dir)
		// 使用 MkdirAll 递归创建所有不存在的目录
		// os.ModePerm 表示 0777 权限（拥有读、写、执行权限）
		err = os.MkdirAll(dir, os.ModePerm)
		if err != nil {
			return fmt.Errorf("创建目录失败: %w", err)
		}
		fmt.Printf("目录创建成功: %s\n", dir)
		return nil
	}
	// 其他未知错误（如权限不足）
	return fmt.Errorf("检查路径时发生未知错误: %w", err)
}

// IsDir 判断所给路径是否为目录
func IsDir(path string) bool {
	s, err := os.Stat(path)
	if err != nil {
		return false
	}
	return s.IsDir()
}

// IsDirExists 判断文件夹是否存在
func IsDirExists(path string) bool {
	_, err := os.Stat(path)
	if err != nil {
		return false
	}
	return true
}

// IsFileExists 判断文件否存在
func IsFileExists(fileUri string) bool {
	_, err := os.Stat(fileUri)
	if err == nil {
		return true
	}
	return false
}

// ObjToMap 结构体 转 map
func ObjToMap(object interface{}) map[string]interface{} {
	bytes, err := json.Marshal(object)
	if err != nil {
		log.Println("【tools - ObjectToMap】转换失败1", err)
	}
	var data map[string]interface{}
	err = json.Unmarshal(bytes, &data)
	if err != nil {
		log.Println("【tools - ObjectToMap】转换失败2", err)
	}
	return data
}

// MapToObj 结构体 转 map
func MapToObj(object map[string]interface{}, obj interface{}) error {
	bytes, err := json.Marshal(object)
	if err != nil {
		log.Println("【tools - ObjectToMap】转换失败1", err)
	}
	err = json.Unmarshal(bytes, obj)
	if err != nil {
		log.Println("【tools - ObjectToMap】转换失败2", err)
	}
	return nil
}

// ObjToJson 结构体 转 json字符串
func ObjToJson(obj interface{}) string {
	jsonBytes, err := jsoniter.Marshal(obj)
	if err != nil {
		log.Println("【tools - ObjToJson】转换失败1", err)
	}
	return string(jsonBytes)
}

// StringToInt64 将字符串转换为 int64
func StringToInt64(s string) (int64, error) {
	result, err := strconv.ParseInt(s, 10, 64)
	if err != nil {
		return 0, fmt.Errorf("StringToInt64 转换失败: 输入 '%s', 错误: %w", s, err)
	}
	return result, nil
}

// Int64ToString 将 int64 转换为字符串
func Int64ToString(i int64) string {
	return strconv.FormatInt(i, 10)
}
